package com.fresh.api;

import java.io.PrintWriter;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.fresh.common.annotation.IgnoreAuth;
import com.fresh.dao.VerifyDao;
import com.fresh.entity.AntifraudUser;
import com.fresh.entity.NutAccessEntity;
import com.fresh.entity.NutBankListData;
import com.fresh.entity.NutBankListEntity;
import com.fresh.entity.NutCreateEntity;
import com.fresh.entity.NutCyberEntity;
import com.fresh.entity.NutQueryEntity;
import com.fresh.entity.NutRequestEntity;
import com.fresh.entity.NutSummaryEntity;
import com.fresh.entity.UserNameEntity;
import com.fresh.entity.ZxExternalData;
import com.fresh.entity.ZxExternalSource;
import com.fresh.service.VerifyService;
import com.fresh.utils.Base64Utils;
import com.fresh.utils.HttpRequest;
import com.fresh.utils.HttpUtils2;
import com.fresh.utils.PropertiesUtils;
import com.fresh.utils.RSAEncryptUtil;
import com.fresh.utils.Sequence;
import com.google.gson.Gson;

/**
 * 坚果银行卡接口
 * 
 * @author mengxiangdong
 * @version 1.0
 * @date 2017年11月1日下午5:40:14 福乐康 Copyright© All Reserved 官方网站：www.flksh.com
 *       未经授权不得进行修改、复制、出售及商业使用
 */
@RequestMapping({ "/nut" })
@Controller
public class NutController {
	private static final Logger log = LoggerFactory
			.getLogger(NutController.class);

	@Autowired
	private VerifyService verifyService;

	@Autowired
	private VerifyDao verifyDao;

	@IgnoreAuth
	@RequestMapping({ "toNut" })
	public String toNut(HttpServletRequest request, AntifraudUser user)
			throws Exception {
		log.info("#toNut() 进入银行卡查询页！");
		return "/buyer/bankList";
	}

	@ResponseBody
	@IgnoreAuth
	@RequestMapping({ "getBankList" })
	public NutBankListData getBankList(HttpServletRequest request, AntifraudUser user)
			throws Exception {
		log.info("#getBankList() 开始创建access_token！");
		
		try {
		Gson gson=new Gson();
		String nut_url = PropertiesUtils.getProperty("nut_url");
		String client_id = PropertiesUtils.getProperty("client_id");
		String client_secret = PropertiesUtils.getProperty("client_secret");
		
				
		//创建access_token
		NutAccessEntity nutAccessEntity=null;
		String resAccessJson=null;
		while (true) {
			String nut_AccessToken_url = nut_url + "openapi/api/v3/oauth2/token";
			Map<String, String> data = new HashMap<String, String>();
			data.put("client_id", client_id);
			data.put("client_secret", client_secret);
			Map<String, String> headerMap = new HashMap<String, String>();
			headerMap.put("Content-Type", "application/json");
			resAccessJson=HttpUtils2.sentPost(nut_AccessToken_url, gson.toJson(data), headerMap);
			log.info("#getBankList() 返回access_token:"+resAccessJson);
			if (resAccessJson!=null) {
				break;
			}
			
		}
		
		//获取银行卡列表
		nutAccessEntity=gson.fromJson(resAccessJson, NutAccessEntity.class);
		String nut_Bank_url = nut_url + "openapi/api/v2/bank/supportedList";
		Map<String, String> bankdata = new HashMap<String, String>();
		Map<String, String> bankheaderMap = new HashMap<String, String>();
		bankheaderMap.put("Content-Type", "application/json");
		bankheaderMap.put("Authorization", "Bearer"+" "+nutAccessEntity.getData().getAccess_token());
		String resBankJson=HttpUtils2.sendGet(nut_Bank_url, bankdata, bankheaderMap);
		log.info("#getBankList() 返回银行卡列表:"+resBankJson);
		NutBankListEntity nutBankListEntity=gson.fromJson(resBankJson, NutBankListEntity.class);
		nutBankListEntity.getData().setAccessToken(nutAccessEntity.getData().getAccess_token());
		return nutBankListEntity.getData();
		} catch (Exception e) {
		}
		return null;
	}
	
	@IgnoreAuth
	@RequestMapping({ "setCyber" })
	public String setCyber(HttpServletRequest request,NutRequestEntity nutRequestEntity)
			throws Exception {
		Gson gson=new Gson();
		log.info("#setCyber() 开始获取银行登录方式！"+gson.toJson(nutRequestEntity));

		//获取银行登录方式
		
		try {
		String nut_url = PropertiesUtils.getProperty("nut_url");
		String nut_cyber_url = nut_url + "/openapi/api/v3/bank/logintypes/"+nutRequestEntity.getTaskSubType();
		Map<String, String> cyberdata = new HashMap<String, String>();
		Map<String, String> cyberheaderMap = new HashMap<String, String>();
		cyberheaderMap.put("Content-Type", "application/json");
		cyberheaderMap.put("Authorization", "Bearer"+" "+nutRequestEntity.getAccessToken());
		cyberheaderMap.put("loginTarget", nutRequestEntity.getLoginTarget());
		String resCyberJson=HttpUtils2.sendGet(nut_cyber_url, cyberdata, cyberheaderMap);
		log.info("#getNut() 获取银行登录方式接口返回:"+resCyberJson);
		NutCyberEntity nutCyberEntity=gson.fromJson(resCyberJson, NutCyberEntity.class);
		
		request.setAttribute("taskSubType", nutCyberEntity.getData().getTaskSubType());
		request.setAttribute("accessToken", nutRequestEntity.getAccessToken());
		for (int i = 0; i <  nutCyberEntity.getData().getLoginCmdFields().size(); i++) {
			if (nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginName().contains("身份证")) {
				request.setAttribute("loginDesc", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginName());
				request.setAttribute("loginType", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginType());
				request.setAttribute("loginTarget", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginTarget());
				request.setAttribute("cmdId", nutCyberEntity.getData().getLoginCmdFields().get(i).getExtraData().getCmdId());
				
				for (int j = 0; j < nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginFields().size(); j++) {
					if (!nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginFields().get(j).getName().contains("密码")) {
						request.setAttribute("loginCode", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginFields().get(j).getCode());
					}
					
				}
				
				if (nutCyberEntity.getData().getLoginCmdFields().get(i).getExtraData().getStatus().equalsIgnoreCase("OK")) {
					return "/buyer/nutLogin";
				}
				
			}
			if (nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginName().contains("卡号")) {
				request.setAttribute("loginDesc", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginName());
				request.setAttribute("loginType", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginType());
				request.setAttribute("loginTarget", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginTarget());
				request.setAttribute("cmdId", nutCyberEntity.getData().getLoginCmdFields().get(i).getExtraData().getCmdId());
				
				for (int j = 0; j < nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginFields().size(); j++) {
					if (!nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginFields().get(j).getName().contains("密码")) {
						request.setAttribute("loginCode", nutCyberEntity.getData().getLoginCmdFields().get(i).getLoginFields().get(j).getCode());
					}
					
				}
				if (nutCyberEntity.getData().getLoginCmdFields().get(i).getExtraData().getStatus().equalsIgnoreCase("OK")) {
					return "/buyer/nutLogin";
				}
			}
		}
		request.setAttribute("loginDesc", nutCyberEntity.getData().getLoginCmdFields().get(0).getLoginName());
		request.setAttribute("loginType", nutCyberEntity.getData().getLoginCmdFields().get(0).getLoginType());
		request.setAttribute("loginTarget", nutCyberEntity.getData().getLoginCmdFields().get(0).getLoginTarget());
		request.setAttribute("cmdId", nutCyberEntity.getData().getLoginCmdFields().get(0).getExtraData().getCmdId());
		
		for (int j = 0; j < nutCyberEntity.getData().getLoginCmdFields().get(0).getLoginFields().size(); j++) {
			if (!nutCyberEntity.getData().getLoginCmdFields().get(0).getLoginFields().get(j).getName().contains("密码")) {
				request.setAttribute("loginCode", nutCyberEntity.getData().getLoginCmdFields().get(0).getLoginFields().get(j).getCode());
			}
			
		}
		
		if (!nutCyberEntity.getData().getLoginCmdFields().get(0).getExtraData().getStatus().equalsIgnoreCase("OK")) {
			request.setAttribute("message", "没有可用登录方式！");
		}
		
		} catch (Exception e) {
			return "/index";
		}
		return "/buyer/nutLogin";
	}
	
	
	
	@IgnoreAuth
	@RequestMapping({ "create" })
	public String create(HttpServletRequest request,NutRequestEntity nutRequestEntity,HttpServletResponse response)
			throws Exception {
		
		try {
			
		
		Gson gson=new Gson();
		log.info("#create() 开始创建任务！"+gson.toJson(nutRequestEntity));
		
		ZxExternalData zxExternalData=null;
		if (request.getSession().getAttribute("USER_SCORE")!=null) {
			 zxExternalData=(ZxExternalData) request.getSession().getAttribute("USER_SCORE");
		
			log.info("#getGs() 当前用户:" + gson.toJson(zxExternalData));
		
		}else{
			 PrintWriter out = response.getWriter();  
		        out.println("<html>");      
		        out.println("<script>");      
		        out.println("window.open ('"+request.getContextPath()+"/index','_top')");      
		        out.println("</script>");      
		        out.println("</html>");    
			return null;
		}
		
		String nut_url = PropertiesUtils.getProperty("nut_url");

		//创建任务
		String nut_create_url = nut_url + "/openapi/api/v2/bank/crawler/task";
		Map<String, Object> createdata = new HashMap<String, Object>();
		createdata.put("taskSubType",nutRequestEntity.getTaskSubType());
		createdata.put("loginType",nutRequestEntity.getLoginType());
		createdata.put("loginTarget",nutRequestEntity.getLoginTarget());
		createdata.put("cmdId",nutRequestEntity.getCmdId());
		createdata.put("userId","1");
		createdata.put("password",RSAEncryptUtil.encrypt(RSAEncryptUtil.publicKeyString, nutRequestEntity.getPassword()));
		UserNameEntity user=new UserNameEntity();
		user.setIdNo(nutRequestEntity.getIdNo());
		user.setFullCardNum(nutRequestEntity.getFullCardNum());
		createdata.put("username",user);
		Map<String, String> createheaderMap = new HashMap<String, String>();
		createheaderMap.put("Content-Type", "application/json");
		createheaderMap.put("Authorization", "Bearer"+" "+nutRequestEntity.getAccessToken());
		log.info("#getNut()创建任务接口请求参数:"+gson.toJson(createdata));
		String resCreateJson=HttpUtils2.sentPost(nut_create_url, gson.toJson(createdata), createheaderMap);
		log.info("#getNut() 创建任务接口返回:"+resCreateJson);
		NutCreateEntity nutCreateEntity=gson.fromJson(resCreateJson, NutCreateEntity.class);
		
		if (nutCreateEntity.isSuccess()==false) {
			request.setAttribute("message", nutCreateEntity.getErrorMsg());
			return "/buyer/nutResult";
		}
		
		//查询任务状态
		while(true) {
			Thread.sleep(3000);
			String nut_query_url = nut_url + "/openapi/api/v2/bank/tasks/"+nutCreateEntity.getData().getUuid()+"/status";
			Map<String, String> querydata = new HashMap<String, String>();
			Map<String, String> queryheaderMap = new HashMap<String, String>();
			queryheaderMap.put("Authorization", "Bearer"+" "+nutRequestEntity.getAccessToken());
			String resQueryJson=HttpUtils2.sendGet(nut_query_url, querydata, queryheaderMap);
			NutQueryEntity nutQueryEntity=gson.fromJson(resQueryJson, NutQueryEntity.class);
			log.info("#getNut()查询任务状态接口返回:"+resQueryJson);
			
			if (resQueryJson==null) {
				request.setAttribute("message", "服务器忙请稍后再试！");
				return "/buyer/nutResult";
			}
			
			if (nutQueryEntity.getData().getType().equals("WAIT_CODE") && nutQueryEntity.getData().getCode().getType().equals("sms")) {
				request.setAttribute("taskId", nutQueryEntity.getData().getTaskId());
				request.setAttribute("accessToken", nutRequestEntity.getAccessToken());
				log.info("#getNut()进入手机验证码页面:"+nutQueryEntity.getData().getDescription());
				return "/buyer/nutCode";
			}
			
			if (nutQueryEntity.getData().getType().equals("WAIT_CODE") && nutQueryEntity.getData().getCode().getType().equals("img")) {
				request.setAttribute("taskId", nutQueryEntity.getData().getTaskId());
				request.setAttribute("accessToken", nutRequestEntity.getAccessToken());
				
				String imgName=Base64Utils.GenerateImage(nutQueryEntity.getData().getCode().getImgBase64Val());
				String getImg_url = PropertiesUtils.getProperty("getImg_url");
				request.setAttribute("imgUrl", getImg_url+imgName+".jpg");
				log.info("#getNut()进入图片验证码页面:"+nutQueryEntity.getData().getDescription());
				return "/buyer/nutImg";
			}
			
			if (nutQueryEntity.getData().getType().equals("DONE_TIMEOUT")) {
				request.setAttribute("message", nutQueryEntity.getData().getDescription());
				return "/buyer/nutResult";
			}
			
			if (nutQueryEntity.getData().getType().equals("DONE_FAIL")) {
				if (nutQueryEntity.getData().getDescription()!=null) {
					request.setAttribute("message", nutQueryEntity.getData().getDescription());
				}else{
					request.setAttribute("message", "爬取失败！");
				}
				
				log.info("#getNut()查询任务状态接口返回:"+nutQueryEntity.getData().getDescription());
				return "/buyer/nutResult";
			}
			
			if (nutQueryEntity.getData().getType().equals("DONE_SUCC") && nutQueryEntity.getData().isFinished()==true) {
				log.info("#getNut()查询任务状态接口返回(DONE_SUCC):"+gson.toJson(nutQueryEntity));
				//获取账单信息
				if (nutQueryEntity.getData().getResultDetail().getBillSummaryId().length>0) {
					for (int i = 0; i < nutQueryEntity.getData().getResultDetail().getBillSummaryId().length; i++) {
						String nut_summary_url = nut_url + "/openapi/api/v2/bank/"+ nutQueryEntity.getData().getResultDetail().getBillSummaryId()[i]+"/billSummary/info";
						Map<String, String> summarydata = new HashMap<String, String>();
						Map<String, String> map=getDate();
						summarydata.put("startDate", map.get("start"));
						summarydata.put("endDate", map.get("end"));
						Map<String, String> summaryheaderMap = new HashMap<String, String>();
						summaryheaderMap.put("Authorization", "Bearer"+" "+nutRequestEntity.getAccessToken());
						summaryheaderMap.put("userId", "1");
						String resSummaryJson=HttpUtils2.sendGet(nut_summary_url, summarydata, summaryheaderMap);
						log.info("#getNut()获取账单信息接口返回:"+resSummaryJson);
						NutSummaryEntity nutSummaryEntity=gson.fromJson(resSummaryJson, NutSummaryEntity.class);
						request.setAttribute("nutData", nutSummaryEntity.getData());
						log.info("#getNut()获取账单信息接口返回:"+gson.toJson(nutSummaryEntity));
						
						//银行卡信息入库
						setSource(zxExternalData.getId(), resSummaryJson);
						//银行卡扣款
						 verifyService.debit(request, "6");
					}
					
				}else{
					request.setAttribute("message", "未爬到相关账单信息！");
					return "/buyer/nutResult";
				}
				
				return "/buyer/nutResult";
			}
		}
		
		} catch (Exception e) {
			request.setAttribute("message", "服务器忙请稍后重试！");
			return "/buyer/nutResult";
		}
		
		
	}
	
	
	@IgnoreAuth
	@RequestMapping({ "vcode" })
	public String query(HttpServletRequest request,NutRequestEntity nutRequestEntity,HttpServletResponse response)
			throws Exception {
		
		try {
		Gson gson=new Gson();
		log.info("#vcode() 开始提交验证码！"+gson.toJson(nutRequestEntity));
		
		ZxExternalData zxExternalData=null;
		if (request.getSession().getAttribute("USER_SCORE")!=null) {
			 zxExternalData=(ZxExternalData) request.getSession().getAttribute("USER_SCORE");
		
			log.info("#getGs() 当前用户:" + gson.toJson(zxExternalData));
		
		}else{
			 PrintWriter out = response.getWriter();  
		        out.println("<html>");      
		        out.println("<script>");      
		        out.println("window.open ('"+request.getContextPath()+"/index','_top')");      
		        out.println("</script>");      
		        out.println("</html>");    
			return null;
		}
	
		String nut_url = PropertiesUtils.getProperty("nut_url");
		
		//提交验证码
		String nut_vcode_url = nut_url + "/openapi/api/v2/bank/tasks/vcode/"+nutRequestEntity.getTaskId()+"?vcode="+nutRequestEntity.getVcode()+"";
		HttpRequest httpRequest =  HttpRequest.put(nut_vcode_url).authorization("Bearer"+" "+nutRequestEntity.getAccessToken());
		String resVcodeJson =null;
		if (httpRequest.ok()) {
			resVcodeJson = httpRequest.body();
			log.info("#getGs() 提交验证码接口返回信息：{}" + resVcodeJson);
		}
		
		NutCreateEntity nutCreateEntity=gson.fromJson(resVcodeJson, NutCreateEntity.class);
		
		//查询任务状态
				while(true) {
					Thread.sleep(3000);
					String nut_query_url = nut_url + "/openapi/api/v2/bank/tasks/"+nutCreateEntity.getData().getUuid()+"/status";
					Map<String, String> querydata = new HashMap<String, String>();
					Map<String, String> queryheaderMap = new HashMap<String, String>();
					queryheaderMap.put("Authorization", "Bearer"+" "+nutRequestEntity.getAccessToken());
					String resQueryJson=HttpUtils2.sendGet(nut_query_url, querydata, queryheaderMap);
					NutQueryEntity nutQueryEntity=gson.fromJson(resQueryJson, NutQueryEntity.class);
					log.info("#getNut()查询任务状态接口返回:"+resQueryJson);
					
					if (resQueryJson==null) {
						request.setAttribute("message", "服务器忙请稍后再试！");
						return "/buyer/nutResult";
					}
					
					if (nutQueryEntity.getData().getType().equals("WAIT_CODE") && nutQueryEntity.getData().getCode().getType().equals("sms")) {
						request.setAttribute("taskId", nutQueryEntity.getData().getTaskId());
						request.setAttribute("accessToken", nutRequestEntity.getAccessToken());
						log.info("#getNut()进入验证码页面:"+nutQueryEntity.getData().getDescription());
						return "/buyer/nutCode";
					}
					
					if (nutQueryEntity.getData().getType().equals("WAIT_CODE") && nutQueryEntity.getData().getCode().getType().equals("img")) {
						request.setAttribute("taskId", nutQueryEntity.getData().getTaskId());
						request.setAttribute("accessToken", nutRequestEntity.getAccessToken());
						
						String imgName=Base64Utils.GenerateImage(nutQueryEntity.getData().getCode().getImgBase64Val());
						String getImg_url = PropertiesUtils.getProperty("getImg_url");
						request.setAttribute("imgUrl", getImg_url+imgName+".jpg");
						log.info("#getNut()进入图片验证码页面:"+nutQueryEntity.getData().getDescription());
						return "/buyer/nutImg";
					}
					
					if (nutQueryEntity.getData().getType().equals("DONE_FAIL")) {
						if (nutQueryEntity.getData().getDescription()!=null) {
							request.setAttribute("message", nutQueryEntity.getData().getDescription());
						}else{
							request.setAttribute("message", "爬取失败！");
						}
						log.info("#getNut()查询任务状态接口返回:"+nutQueryEntity.getData().getDescription());
						return "/buyer/nutResult";
					}
					
					if (nutQueryEntity.getData().getType().equals("DONE_SUCC") && nutQueryEntity.getData().isFinished()==true) {
						log.info("#getNut()查询任务状态接口返回(DONE_SUCC):"+gson.toJson(nutQueryEntity));
						//获取账单信息
						if (nutQueryEntity.getData().getResultDetail().getBillSummaryId().length>0) {
							for (int i = 0; i < nutQueryEntity.getData().getResultDetail().getBillSummaryId().length; i++) {
								String nut_summary_url = nut_url + "/openapi/api/v2/bank/"+ nutQueryEntity.getData().getResultDetail().getBillSummaryId()[i]+"/billSummary/info";
								Map<String, String> summarydata = new HashMap<String, String>();
								Map<String, String> map=getDate();
								summarydata.put("startDate", map.get("start"));
								summarydata.put("endDate", map.get("end"));
								Map<String, String> summaryheaderMap = new HashMap<String, String>();
								summaryheaderMap.put("Authorization", "Bearer"+" "+nutRequestEntity.getAccessToken());
								summaryheaderMap.put("userId", "1");
								String resSummaryJson=HttpUtils2.sendGet(nut_summary_url, summarydata, summaryheaderMap);
								log.info("#getNut()获取账单信息接口返回:"+resSummaryJson);
								NutSummaryEntity nutSummaryEntity=gson.fromJson(resSummaryJson, NutSummaryEntity.class);
								request.setAttribute("nutData", nutSummaryEntity.getData());
								log.info("#getNut()获取账单信息接口返回:"+gson.toJson(nutSummaryEntity));
								
								//银行卡信息入库
								setSource(zxExternalData.getId(), resSummaryJson);
								//银行卡扣款
								 verifyService.debit(request, "6");
							}
							
						}else{
							
							request.setAttribute("message", "未爬到相关账单信息！");
							return "/buyer/nutResult";
							
						}
						
						
						return "/buyer/nutResult";
					}
				}
				
		} catch (Exception e) {
			request.setAttribute("message", "服务器忙请稍后重试！");
			return "/buyer/nutResult";
		}
	}
	
	
	
     public static Map<String, String> getDate() {
	Date dNow = new Date();   //当前时间
	Date dBefore = new Date();
	Calendar calendar = Calendar.getInstance(); //得到日历
	calendar.setTime(dNow);//把当前时间赋给日历
	calendar.add(calendar.MONTH, -6);  //设置为前6月
	dBefore = calendar.getTime();   //得到前6月的时间
	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM"); //设置时间格式
	String defaultStartDate = sdf.format(dBefore);    //格式化前6月的时间
	String defaultEndDate = sdf.format(dNow); //格式化当前时间
	Map<String, String> map=new HashMap<String,String>();
	map.put("start", defaultStartDate);
	map.put("end", defaultStartDate);
	return map;
	
}
     
     
    public static String getStringDate(Date date){
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
		String str=sdf.format(date);  
		return str;
     }
    
    
	public void setSource(String externalId,String json){
		Timestamp now = new Timestamp(System.currentTimeMillis());
		
		ZxExternalSource zxExternalSource = new ZxExternalSource();
		zxExternalSource.setId(Sequence.nextId());
		zxExternalSource.setType(PropertiesUtils.getProperty("nut_type")); //2：学信网
		zxExternalSource.setVersion("v2");
		zxExternalSource.setExternalId(externalId);
		zxExternalSource.setDataSource(json);
		zxExternalSource.setIntertype(Integer.valueOf(3));
		zxExternalSource.setCreateTime(now);
		verifyService.saveSource(zxExternalSource);
	}
	
	

	public static void main(String[] args) {
	System.out.println(getStringDate(new Date()));

	}
	

}
